home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************
- **
- ** Folder Name: BS
- ** File Name: Preferences.c
- **
- ** Copyright: © 1993 by Siren Enterprises, all rights reserved.
- **
- ** Description: Support Routines for Lil´ BeepSay Preferences
- **
- *******************************************************************************
- ** A U T H O R I D E N T I T Y
- *******************************************************************************
- **
- ** Initials Name
- ** -------- -----------------------------------------------
- ** kw Ken Wieschhoff
- **
- *******************************************************************************
- ** R E V I S I O N H I S T O R Y
- *******************************************************************************
- **
- ** Date Time Author Description
- ** -------- ----- ------ ---------------------------------------------
- ** 06/22/93 15:54 kw 1+ Add animate lips option
- ** 05/17/93 21:02 kw Original version
- **
- ******************************************************************************/
-
- #include <OSUtils.h>
- #include <Files.h>
- #include <Types.h>
- #include <Resources.h>
- #include <script.h>
- #include <GestaltEqu.h>
- #include <traps.h>
- #include <errors.h>
- #include <PLStringFuncs.h>
- #include <Folders.h>
- #include <Packages.h>
- #include "Utilities.h"
- #include "Preferences.h"
-
- extern pascal void ShowStr( StringPtr str);
- extern pascal void ShowStrNum( StringPtr str, OSErr err);
-
- #define BTstQ(arg, bitnbr) (arg & (1 << bitnbr))
-
-
- //••••••••••••••••••••••••••••••••••••••••••••••••
- //••••••••••• Preferences routines••••••••••••••••
- //••••••••••••••••••••••••••••••••••••••••••••••••
- pascal OSErr GetPreferencesFileName(FSSpec *aSpec, Str31 filename)
- {
- OSErr err;
- long gestaltResult;
- SysEnvRec theWorld;
- WDPBRec wdirpb;
- unsigned char volName[34];
- FSSpec newFolderSpec;
-
- // Check that the Gestalt trap exists. If this is a 6.0.7 system, Gestalt
- // will be added via a system extension. If the extension is off, executing
- // Gestalt will cause an unimplemented trap instruction.
- // _Gestalt, _GestaltDispatch is 0xA0AD
- if (NGetTrapAddress(0xA0AD, GetTrapType(0xA0AD)) ==
- NGetTrapAddress(_Unimplemented, GetTrapType(_Unimplemented)) )
- return unimpErr;
-
- // Check that the FindFolder trap is present.
- err = Gestalt(gestaltFindFolderAttr, &gestaltResult);
-
- // Check that the Folder Manager is available. If not use the system folder.
- if (err == noErr && ( BTstQ (gestaltResult, gestaltFindFolderPresent)) ) {
-
-
- // Find the FSSpec of the Preferences Folder within the System Folder.
- err = FindFolder(kOnSystemDisk, kPreferencesFolderType,
- kCreateFolder, &aSpec->vRefNum, &aSpec->parID);
- if ( err != noErr) {
- return ( err);
- }
-
- err = FSMakeFSSpec( aSpec->vRefNum, aSpec->parID, filename, &newFolderSpec);
- if ( err != fnfErr) {
- if (err != noErr) {
- return ( err);
- }
- }
- *aSpec = newFolderSpec;
- }
- else {
- err = SysEnvirons( 2, &theWorld);
- if (err != noErr)
- return (err);
-
- // Get volume reference number and dirID of the system file
- zeroMemory((Ptr)&wdirpb, sizeof(WDPBRec));
- wdirpb.ioVRefNum = theWorld.sysVRefNum;
- volName[0] = '\000';
- wdirpb.ioNamePtr = volName;
- err = PBGetWDInfo(&wdirpb, 0);
- if (err != noErr)
- return (err);
- aSpec->vRefNum = wdirpb.ioWDVRefNum;
- aSpec->parID = wdirpb.ioWDDirID;
- PLstrcpy(aSpec->name, filename);
- }
-
-
- return (noErr);
- }
-
- pascal OSErr WriteToPrefs(PreferencesHdl prefHdl, Str31 filename)
- {
- long count;
- short dRefNum;
- FSSpec aSpec;
- OSErr err;
- short versionNumber;
-
- // Get the preferences file name from disk.
- err = GetPreferencesFileName( &aSpec, filename);
- if ( err != noErr)
- return ( err);
-
-
- // Delete the preferences file unconditionally. Don't flag an error
- // if it isn't there.
- err = xFSpDelete(&aSpec);
-
- // Ignore file-not-found errors; we may be creating it for the first time.
- if (( err != noErr) && ( err != fnfErr)) {
- ShowStrNum( "\pFSpDelete error deleting old preferences file", err);
- return ( err);
- }
-
- // Create a new preferences file.
- err = xFSpCreateResFile(&aSpec, kBeepSaySignature, 'Pref', smSystemScript);
- if ( err != noErr) {
- ShowStrNum("\pFSpCreateResFile error creating a new preferences file ", err);
- return ( err);
- }
-
- // Open the data fork of the new preferences.
- err = xFSpOpenDF(&aSpec, fsWrPerm, &dRefNum);
-
- if (err != noErr) {
- ShowStrNum("\pFS(p)Open(DF) error opening a new preferences file ", err);
- return ( err);
- }
-
- // Write the version number of the file.
- versionNumber = kCurrentVersion;
- count = sizeof(versionNumber);
- err = FSWrite(dRefNum, &count, &versionNumber);
- if (err != noErr) {
- ShowStrNum("\pFSWrite error writing version number ", err);
- goto errExit;
- }
-
- if (count != sizeof( versionNumber)) {
- ShowStrNum("\pFSWrite error writing version. Incorrect count (should be 2)", count);
- err = (-1);
- goto errExit;
- }
-
- HLock( (Handle) prefHdl);
- // Write the Preferences structure to disk.
- count = sizeof(struct Preferences);
- err = FSWrite(dRefNum, &count, (Ptr) *prefHdl);
- if (err != noErr) {
- ShowStrNum("\pFSWrite error writing version number ", err);
- goto errExit;
- }
-
- if (count != sizeof( struct Preferences)) {
- ShowStrNum("\pFSWrite error writing data. Count should be", sizeof(struct Preferences));
- ShowStrNum("\pCount is: ", count);
- err = (-1);
- goto errExit;
- }
-
-
- errExit:
-
- HUnlock( (Handle) prefHdl);
- FSClose( dRefNum);
- if ( err != noErr) {
- xFSpDelete(&aSpec);
- }
- return ( err);
-
- }
-
- pascal OSErr _ReadPreferences(PreferencesHdl *PreferencesHandle, Str31 filename)
- {
- OSErr err;
- FSSpec aSpec;
- short versionNumber;
- short dRefNum = 0;
- PreferencesHdl prefHdl = nil;
- long count;
-
- *PreferencesHandle = nil;
-
- // Get the preferences file name from disk.
- err = GetPreferencesFileName( &aSpec, filename);
- if ( err != noErr)
- return ( err);
-
- // Open the data fork of the preferences file if it exists.
- err = xFSpOpenDF(&aSpec, fsRdPerm, &dRefNum);
-
- if (err != noErr) {
- // This isn't really an 'error' as such
- // ShowStrNum("\pFSpOpenDF error while opening preferences file ", err);
- dRefNum = 0; // To be safe
- goto createDefaultPrefs;
- }
-
- // Get the version number of the file.
- count = sizeof(versionNumber);
- err = FSRead(dRefNum, &count, &versionNumber);
- if (err != noErr) {
- ShowStrNum("\pFSRead error while reading version number ", err);
- goto createDefaultPrefs;
- }
-
- prefHdl = (PreferencesHdl) NewHandleSys( sizeof(struct Preferences));
- if ( prefHdl == nil) {
- err = MemError();
- FSClose( dRefNum);
- return( err);
- }
-
- switch (versionNumber) {
-
- case kCurrentVersion :
-
- count = sizeof(struct Preferences);
- err = FSRead( dRefNum, &count, (Ptr) *prefHdl);
-
- // Check for a read error or not enough data read in.
- if ( err != noErr) {
- ShowStrNum("\pFSRead error while reading Preferences data from disk ", err);
- goto createDefaultPrefs;
- }
-
- if (count != sizeof(struct Preferences)) {
- ShowStrNum("\pFSRead error reading Preferences. Count should be", sizeof(struct Preferences));
- ShowStrNum("\pCount is", count);
- goto createDefaultPrefs;
- }
-
- FSClose( dRefNum);
- dRefNum = 0; // To be safe
-
-
- break;
-
- // Unrecognized version number. Don't take chances; create a new one.
- default:
- goto createDefaultPrefs;
- break;
-
- }
-
- *PreferencesHandle = prefHdl;
-
-
- return (err);
-
- // This label is reached if there is a recoverable problem: the preferences
- // file version is incorrect or unrecognized, or not all the data was read.
- // In any case, we close the old file (if open), then delete it as we're
- // going to create a new one anyway
-
- createDefaultPrefs:
- if ( prefHdl != nil) {
- DisposeHandle( (Handle) prefHdl);
- prefHdl = nil;
- }
-
- if ( dRefNum != 0) {
- FSClose( dRefNum);
- dRefNum = 0;
- }
- err = xFSpDelete(&aSpec);
-
- // Create a new Preferences handle.
- count = sizeof(struct Preferences);
- prefHdl = (PreferencesHdl) NewHandleSys( count);
- if ( prefHdl == nil) {
- err = MemError();
- ShowStrNum("\pNewHandleSys is nil when creating new Preferences handle. ", err);
- return ( err);
- }
-
-
- HLock( (Handle) prefHdl);
-
- // Fill in the defaults.
- (**prefHdl).on_off = false;
- (**prefHdl).onlyPlayOne = true;
- (**prefHdl).iconAtStartup = true;
- (**prefHdl).animate = true;
- (**prefHdl).theText[0] = 0;
- (void) MakeVoiceSpec('????', '????', &(**prefHdl).theVoice);
- (**prefHdl).theRate = 0.0;
- (**prefHdl).thePitch = 0.0;
-
- HUnlock( (Handle) prefHdl);
-
- // Write the handle data to the Preferences file (it locks/unlocks it and
- // creates the file if needed)
- err = WriteToPrefs( prefHdl, filename);
-
- if ( err == noErr) {
- *PreferencesHandle = prefHdl;
- }
- else {
- DisposeHandle( (Handle) prefHdl);
- }
-
- return ( err);
- }
-
- pascal OSErr xFSpDelete(const FSSpec *spec)
- {
- long gestaltResult;
- short err;
-
- err = Gestalt(gestaltFSAttr, &gestaltResult);
-
- if (err == noErr && (gestaltResult & (1 << gestaltHasFSSpecCalls)))
- {
- return FSpDelete(spec);
- } else
- {
- HParamBlockRec hpb;
-
- zeroMemory((Ptr)&hpb, sizeof(HParamBlockRec));
- specToHParamBlock(spec, &hpb);
- return PBHDelete(&hpb, false);
- }
- }
-
- pascal OSErr xFSpCreate(const FSSpec *spec,OSType creator, OSType fileType,
- ScriptCode scriptTag)
- {
- long gestaltResult;
- short err;
-
- err = Gestalt(gestaltFSAttr, &gestaltResult);
-
- if (err == noErr && (gestaltResult & (1 << gestaltHasFSSpecCalls)))
- {
- return FSpCreate(spec, creator, fileType, scriptTag);
- } else
- {
- return sys6Create(spec,creator,fileType);
- }
- }
-
- pascal OSErr xFSpCreateResFile(const FSSpec *spec,OSType creator,OSType fileType,
- ScriptCode scriptTag)
- {
- long gestaltResult;
- short err;
-
- err = Gestalt(gestaltFSAttr, &gestaltResult);
-
- if (err == noErr && (gestaltResult & (1 << gestaltHasFSSpecCalls)))
- {
- FSpCreateResFile(spec, creator, fileType, scriptTag);
- return ResError();
- } else
- {
- return sys6Create(spec,creator,fileType);
- }
- }
-
- pascal OSErr xFSpOpenDF(const FSSpec *spec,char permission,short *refNum)
- {
- long gestaltResult;
- short err;
- OSErr openErr;
-
- err = Gestalt(gestaltFSAttr, &gestaltResult);
-
- if (err == noErr && (gestaltResult & (1 << gestaltHasFSSpecCalls)))
- {
- return FSpOpenDF(spec, permission, refNum);
- } else
- {
- HParamBlockRec hpb;
-
- zeroMemory((Ptr)&hpb, sizeof(HParamBlockRec));
- specToHParamBlock(spec, &hpb);
- hpb.ioParam.ioPermssn = permission;
- hpb.ioParam.ioMisc = NULL;
- openErr = PBHOpen(&hpb, false);
- *refNum = hpb.ioParam.ioRefNum;
- return openErr;
- }
- }
-
-
- /*
- specToHParamBlock
-
- Moves the information from the FSSpec record to the appropriate fields of the
- paramblock record.
-
- */
- static void specToHParamBlock(const FSSpec *spec, HParmBlkPtr hpb)
- {
- hpb->ioParam.ioVRefNum = spec->vRefNum;
- hpb->fileParam.ioDirID = spec->parID;
- hpb->ioParam.ioNamePtr = (unsigned char *)spec->name;
- }
-
- static void zeroMemory(Ptr d,long len)
- {
- char *p = d;
-
- if(p != NULL) {
- while(len-- > 0)
- *p++ = 0;
- }
- }
-
- OSErr sys6Create(const FSSpec *spec,OSType creator,OSType fileType)
- {
- short err;
- HParamBlockRec hpb;
-
- zeroMemory((Ptr)&hpb, sizeof(HParamBlockRec));
- specToHParamBlock(spec, &hpb);
- err = PBHCreate(&hpb, false);
- if (err == noErr)
- {
- zeroMemory((Ptr)&hpb, sizeof(HParamBlockRec));
- specToHParamBlock(spec, &hpb);
- err = PBHGetFInfo(&hpb, false);
- if (err == noErr)
- {
- specToHParamBlock(spec, &hpb);
- hpb.fileParam.ioFlFndrInfo.fdType = fileType;
- hpb.fileParam.ioFlFndrInfo.fdCreator = creator;
- err = PBHSetFInfo(&hpb, false);
- if (err == noErr)
- {
- ParamBlockRec pb;
-
- zeroMemory((Ptr)&pb, sizeof(HParamBlockRec));
- pb.ioParam.ioVRefNum = spec->vRefNum;
- PBFlushVol(&pb, false);
- }
- }
- }
- return err;
- }
-
-